package com.booksystem.campuslibrarymanagementsystem.controller.admin;


import com.booksystem.campuslibrarymanagementsystem.commen.request.adminrequest.UserManagement.*;
import com.booksystem.campuslibrarymanagementsystem.commen.result.Result;
import com.booksystem.campuslibrarymanagementsystem.commen.result.Verifys;
import com.booksystem.campuslibrarymanagementsystem.entity.AccountTable;
import com.booksystem.campuslibrarymanagementsystem.entity.UserTable;
import com.booksystem.campuslibrarymanagementsystem.service.AccountTableService;
import com.booksystem.campuslibrarymanagementsystem.service.UserTableService;
import com.booksystem.campuslibrarymanagementsystem.utils.AuditUtil;
import com.booksystem.campuslibrarymanagementsystem.utils.EmailSender;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/Admin")
@Api(tags = "user管理")
public class UserManagementController {
    private final String idt = "admin";
    Verifys verifys = new Verifys();
    UserTable userTable = new UserTable();
    @Autowired
    private AccountTableService accountTableService;
    @Autowired
    private UserTableService userTableService;

    /**
     * 1.添加user接口。
     *
     * @return Result.success();or return Result.fail();
     * @RequestBody Adduser（token，name名字）
     * 1.解析获得的token值，并保存到键值对Map-parsed中
     * 2.判断parsed是否为null
     * 3.null：返回失败信息-请输入正确token值。不为null：判断解析到的身份码是否为admin。
     * 4.不为admin；返回失败信息-身份权限不足。是admin：判断解析到的学号是否在account表中存在。
     * 5.不存在：返回失败信息-该学号不存在。存在：将数据保存到userTable1中并保存到数据库user中，判断是否保存成功。
     * 6.不成功：返回失败信息-添加失败。成功：返回成功信息-添加成功
     */
    @PostMapping("/addUser")
    @ApiOperation(value = "添加user", notes = "在user表内添加信息")
    public Result addUser(@RequestBody Adduser adduser) {
        verifys = AuditUtil.verifyUtil(adduser.getToken(),idt,accountTableService);
        switch (verifys.getMsg()) {
            case "成功":
                int i = 0;
                UserTable userTable1 = userTableService.selectLastIds();
                if (userTable1 != null) {
                    i = userTable1.getIds() + 1;
                }
                userTable.setIds(i);
                userTable.setName(adduser.getName());
                userTable.setState("未启动");
                boolean a = userTableService.save(userTable);
                if (a) {
                    System.out.println( adduser.getName() + "user添加成功");
                    return Result.success("添加成功", 1);
                } else {
                    return Result.fail("添加失败");
                }
            default:
                return Result.fail(verifys.getMsg());
        }
    }

    /**
     * 2.修改user名称接口。
     *
     * @return Result.success();or return Result.fail();
     * @RequestBody Update（token，name名称，ids学号）
     * 1.解析获得的token值，并保存到键值对Map-parsed中
     * 2.判断parsed是否为null
     * 3.null：返回失败信息-请输入正确token值。不为null：判断解析到的身份码是否为admin。
     * 4.不为admin；返回失败信息-身份权限不足。是admin：判断解析到的学号是否在account表中存在。
     * 5.不存在：返回失败信息-该学号不存在。存在：判断输入的ids格式是否正确。
     * 6.不正确：返回失败信息-ids格式不为学号格式。正确：通过输入的ids在user表内查询是否存在。
     * 7.不存在：返回失败信息-该学号在user表内不存在。存在；判断输入的新名称和旧名称是否一致。
     * 8.一致；返回失败信息-更新名称和旧名称一致。不一致：判断该ids的账户状态是已启动/已停用，还是未启动。
     * 9.未启动：直接更新user表内名称，并返回成功提示-名称修改成功。已启动/已停用：更新user表内名称并判断是否成功。
     * 10.不成功：返回失败信息-user表更新失败。成功：更新account表内此ids的account账户的名称并判断是否成功
     * 11.不成功：返回失败信息-account更新失败。成功：返回成功信息-名称修改成功
     */
    @PostMapping("/updateUserName")
    @ApiOperation(value = "修改user名称", notes = "修改名称")
    public Result updateUserName(@RequestBody Update update) {
        verifys = AuditUtil.verifyUtil(update.getToken(),idt,accountTableService);
        switch (verifys.getMsg()) {
            case "成功":
                if (update.getIds().matches("^\\d{9}$")) {
                    int ids = Integer.parseInt(update.getIds());
                    userTable = userTableService.queryByIds(ids);
                    if (userTable != null) {
                        if (userTable.getName().equals(update.getName())) {
                            return Result.fail("更新名称和旧名称一致");
                        } else {
                            if (userTable.getState().equals("已通过") || userTable.getState().equals("已停用")) {
                                boolean a = userTableService.upDataName(update.getIds(), update.getName());
                                if (a) {
                                    boolean b = accountTableService.upDataName(update.getIds(), update.getName());
                                    if (b) {
                                        System.out.println( update.getName() + "user修改成功");
                                        return Result.success("名称修改成功", 1);
                                    } else {
                                        return Result.fail("account更新失败");
                                    }
                                } else {
                                    return Result.fail("user表更新失败");
                                }
                            } else if (userTable.getState().equals("未启动")) {
                                boolean a = userTableService.upDataName(update.getIds(), update.getName());
                                if (a) {
                                    System.out.println( update.getName() + "user修改成功");
                                    return Result.success("名称修改成功", 1);
                                } else {
                                    return Result.fail("更新失败");
                                }
                            } else {
                                return Result.fail("user表内此账户状态异常");
                            }
                        }
                    } else {
                        return Result.fail("该学号在user表内不存在");
                    }
                } else {
                    return Result.fail("ids格式不为学号格式");
                }
            default:
                return Result.fail(verifys.getMsg());
        }
    }

    /**
     * 3.状态修改接口。已启动-已停用
     *
     * @return Result.success();or return Result.fail();
     * @RequestBody Deleteuser（token值，ids学号）
     * 1.解析获得的token值，并保存到键值对Map-parsed中
     * 2.判断parsed是否为null
     * 3.null：返回失败信息-请输入正确token值。不为null：判断解析到的身份码是否为admin。
     * 4.不为admin；返回失败信息-身份权限不足。是admin：判断解析到的学号是否在account表中存在。
     * 5.不存在：返回失败信息-该学号不存在。存在：判断输入的ids格式是否正确。
     * 6.不正确：返回失败信息-ids格式不为学号格式。正确：通过输入的ids在user表内查询是否存在。
     * 7.不存在：返回失败信息-该学号在user表内不存在。存在；判断该账户的状态是否为未启动
     * 8.是：返回失败信息-该账户未启动，状态无法更改。不是：通过输入的ids更新状态，并判断是否更新成功
     * 9.更新失败：返回失败信息-状态停用/启动失败。更新成功：通过ids到account表内更新此账户的状态。并判断是否更新成功
     * 10.更新失败：返回失败信息-停用/启动失败。更新成功：发送邮件到此账户的邮箱上并返回成功信息-user停用/启动成功
     */
    @PostMapping("/updateUser")
    @ApiOperation(value = "状态修改", notes = "停用")
    public Result updateUser(@RequestBody Deleteuser deleteuser) {
        verifys = AuditUtil.verifyUtil(deleteuser.getToken(),idt,accountTableService);
        switch (verifys.getMsg()) {
            case "成功":
                if (deleteuser.getIds().matches("^\\d{9}$")) {
                    int ids = Integer.parseInt(deleteuser.getIds());
                    userTable = userTableService.queryByIds(ids);
                    if (userTable != null) {
                        if (userTable.getState().equals("已通过")) {
                            boolean a = userTableService.upDataState(deleteuser.getIds(), "已停用");
                            if (a) {
                                boolean b = accountTableService.upDataState(deleteuser.getIds(), "已停用");
                                if (b) {
                                    AccountTable accountTable1 = accountTableService.queryByAccount(deleteuser.getIds());
                                    EmailSender.sendEmails(accountTable1.getEmail(), "【校园图书管理系统】提示：您的账户" + deleteuser.getIds() + "已被停用");
                                    System.out.println("user停用成功");
                                    return Result.success("user停用成功", 1);
                                } else {
                                    return Result.fail("停用失败");
                                }
                            } else {
                                return Result.fail("状态停用失败");
                            }
                        } else if (userTable.getState().equals("已停用")) {
                            boolean a = userTableService.upDataState(deleteuser.getIds(), "已通过");
                            if (a) {
                                boolean b = accountTableService.upDataState(deleteuser.getIds(), "已通过");
                                if (b) {
                                    AccountTable accountTable1 = accountTableService.queryByAccount(deleteuser.getIds());
                                    EmailSender.sendEmails(accountTable1.getEmail(), "【校园图书管理系统】提示：您的账户" + deleteuser.getIds() + "已被启动");
                                    System.out.println("user启动成功");
                                    return Result.success("user启动成功", 1);
                                } else {
                                    return Result.fail("启动失败");
                                }
                            } else {
                                return Result.fail("状态启动失败");
                            }
                        } else {
                            return Result.fail("该账户未启动，状态无法更改");
                        }

                    } else {
                        return Result.fail("在user表内没有找到此账户");
                    }
                } else {
                    return Result.fail("ids格式不为学号格式");
                }
            default:
                return Result.fail(verifys.getMsg());
        }
    }

    /**
     * 4.查询uer列表接口。
     *
     * @return Result.success();or return Result.fail();
     * @RequestBody Selectuserlist（token，ids学号，state状态，name名字）
     * 1.解析获得的token值，并保存到键值对Map-parsed中
     * 2.判断parsed是否为null
     * 3.null：返回失败信息-请输入正确token值。不为null：判断解析到的身份码是否为admin。
     * 4.不为admin；返回失败信息-身份权限不足。是admin：判断解析到的学号是否在account表中存在。
     * 5.不存在：返回失败信息-该学号不存在。存在：判断输入的学号格式是否正确或为空
     * 6.判断不通过：返回失败信息-ids格式不为学号格式。判断通过：判断输入的状态是否正确或为空
     * 7.判断不通过：返回失败信息-state状态异常。判断通过:在user表内查询所有符合的信息并保存到list中并判断list是否有数据
     * 8.没有：返回失败信息-暂时没有数据。有：返回成功数据list
     */
    @PostMapping("/selectUserList")
    @ApiOperation(value = "查询uer列表", notes = "通过ids，状态，名称查询")
    public Result<List<UserTable>> selectUserList(@RequestBody Selectuserlist selectuserlist) {
        verifys = AuditUtil.verifyUtil(selectuserlist.getToken(),idt,accountTableService);
        switch (verifys.getMsg()) {
            case "成功":
                if (selectuserlist.getIds().matches("^\\d{9}$") || selectuserlist.getIds().isEmpty()) {
                    String state = selectuserlist.getState();
                    if (state.isEmpty() || state.equals("已通过") || state.equals("未启动") || state.equals("已停用")) {
                        List<UserTable> list = userTableService.selectListUser(selectuserlist.getIds(), selectuserlist.getState(), selectuserlist.getName());
                        if (!list.isEmpty()) {
                            System.out.println("user列表查询成功");
                            return Result.success(list, list.size());
                        } else {
                            return Result.fail("暂时没有数据");
                        }
                    } else {
                        return Result.fail("state状态异常");
                    }
                } else {
                    return Result.fail("ids格式不为学号格式");
                }
            default:
                return Result.fail(verifys.getMsg());
        }
    }

    /**
     * 5.uer列表接口。
     *
     * @return Result.success();or return Result.fail();
     * @RequestBody Userlist
     * 1.解析获得的token值，并保存到键值对Map-parsed中
     * 2.判断parsed是否为null
     * 3.null：返回失败信息-请输入正确token值。不为null：判断解析到的身份码是否为admin。
     * 4.不为admin；返回失败信息-身份权限不足。是admin：判断解析到的学号是否在account表中存在。
     * 5.不存在：返回失败信息-该学号不存在。存在：查询所有user表内数据并保存到list中，判断list是否有数据
     * 6.没有：返回失败信息-暂时没有user数据。有：返回成功数据-list
     */
    @PostMapping("/userList")
    @ApiOperation(value = "user列表", notes = "点击功能自动获取列表")
    public Result<List<UserTable>> userList(@RequestBody Userlist userlist) {
        verifys = AuditUtil.verifyUtil(userlist.getToken(),idt,accountTableService);
        switch (verifys.getMsg()) {
            case "成功":
                List<UserTable> list = userTableService.list();
                if (!list.isEmpty()) {
                    System.out.println("user列表发送成功");
                    return Result.success(list, list.size());
                } else {
                    return Result.fail("暂时没有user数据");
                }
            default:
                return Result.fail(verifys.getMsg());
        }
    }
}
